author:魏静崎
2025年7月2日
K8s学习
来源:学习b站薪享宏福Kubernetes课程
存储分类
元数据
configMap:用于保存配置数据(明文)
Secret:用于保存敏感性数据(编码)
Downward API:容器在运行时从 Kubernetes API 服务器获取有关它们自身的信息
真实数据
Volume:用于存储临时或者持久性数据
PersistentVolume:申请制的持久化存储
ConfigMap
配置信息的保存方式
多个不同的服务内部的文件达到一致:
共享:每一次读取都需要网络IO
注入 :一次注入后,多次读取不再消耗网络IO
ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象。
ConfigMap
创建
–from-file
文件内部必须是一行一对的 kv对
可以在使用时候注入到pod内部变成环境变量
文件内部必须不是一行一对的 kv对
更新 ConfigMap 后:
使用该 ConfigMap 挂载的 Env 不会同步更新
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
Secret
编码而来的安全
定义
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
特性
Kubernetes 通过仅仅将 Secret 分发到需要访问 Secret 的 Pod 所在的机器节点来保障其安全性
Secret 只会存储在节点的内存中,永不写入物理存储,这样从节点删除 secret 时就不需要擦除磁盘数据
从 Kubernetes1.7 版本开始,etcd 会以加密形式存储 Secret,一定程度的保证了 Secret 安全性
类型
![[Pasted image 20250710213935.png]]
Opaque
当 Secret 配置文件中未作显式设定时,默认的 Secret 类型是 Opaque。 当你使用 kubectl 来创建一个 Secret 时,你会使用 generic 子命令来标明要创建的是一个 Opaque 类型 Secret。
Opaque-Volume
当已经存储于卷中被使用的 Secret 被更新时,被映射的键也将终将被更新。 组件 kubelet 在周期性同步时检查被挂载的 Secret 是不是最新的。 但是,它会使用其本地缓存的数值作为 Secret 的当前值。使用 Secret 作为子路径卷挂载的容器不会收到 Secret 更新(不能热更新)。
Opaque-Volume-不可更改
Kubernetes 给不可变的 Secret 和 ConfigMap 提供了一种可选配置, 可以设置各个 Secret 和 ConfigMap 为不可变的。 对于大量使用 Secret 的集群(至少有成千上万各不相同的 Secret 供 Pod 挂载), 禁止变更它们的数据有下列好处:
防止意外(或非预期的)更新导致应用程序中断
通过将 Secret 标记为不可变来关闭 kube-apiserver 对其的监视,从而显著降低 kube-apiserver 的负载,提升集群性能。
Download API
容器在运行时从 Kubernetes API 服务器获取有关它们自身的信息
Downward API 是 Kubernetes 中的一个功能,它允许容器在运行时从 Kubernetes API 服务器获取有关它们自身的信息。这些信息可以作为容器内部的环境变量或文件注入到容器中,以便容器可以获取有关其运行环境的各种信息,如 Pod 名称、命名空间、标签等
Volume
存在的意义
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在 Pod
中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的 Volume
抽象就很好的解决了这些问题
emptyDir
当 Pod 被分配给节点时,首先创建 emptyDir
卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入 emptyDir
卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir
中的数据将被永久删除
容器崩溃不会从节点中移除 pod,因此 emptyDir
卷中的数据在容器崩溃时是安全的
emptyDir 的用法有:
暂存空间,例如用于基于磁盘的合并排序、用作长时间计算崩溃恢复时的检查点
Web 服务器容器提供数据时,保存内容管理器容器提取的文件
hostPath
hostPath 卷将主机节点的文件系统中的文件或目录挂载到集群中
hostPath 用途如下
运行需要访问 Docker 内部的容器;使用 /var/lib/docker
的 hostPath
在容器中运行 cAdvisor;使用 /dev/cgroups
的 hostPath
允许 pod 指定给定的 hostPath 是否应该在 pod 运行之前存在,是否应该创建,以及它应该以什么形式存在
hostPath-注意
由于每个节点上的文件都不同,具有相同配置(例如从 podTemplate 创建的)的 pod 在不同节点上的行为可能会有所不同
当 Kubernetes 按照计划添加资源感知调度时,将无法考虑 hostPath
使用的资源
在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或修改主机上的文件权限以便写入 hostPath
卷
PV/PVC
PV 是集群中的一块预配置的存储资源,由管理员手动创建或通过 StorageClass 动态生成。它是集群级别的资源,独立于 Pod 生命周期,即使 Pod 被删除,PV 中的数据仍然保留。
PVC 是用户(开发者)对存储资源的请求,类似于 Pod 对 CPU/内存的请求。PVC 会绑定到符合条件的 PV,从而为 Pod 提供存储。
匹配条件
容量:PV 的值不小于 PVC 要求,可以大于最好一致
读写策略:完全匹配
单节点读写 - ReadWriteOnce - RWO
多节点只读 - ReadOnlyMany - ROX
多节点读写 - ReadWriteMany - RWX
存储类:PV 的类与 PVC 的类必须一致,不存在包容降级关系
回收策略
Retain(保留):手动回收
Recycle(回收):基本擦除(rm -rf /thevolume/*
)
Delete(删除):关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除
当前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略
状态
Available(可用) - 一块空闲资源还没有被任何声明所绑定
Bound(已绑定)- 卷已经被声明绑定
Released(已释放)- 声明被删除,但是资源还未被集群重新声明
Failed(失败)- 该卷的自动回收失败
命令行会显示绑定到 PV 的 PVC 的名称
PVC保护
PVC 保护的目的是确保由 pod 正在使用的 PVC 不会从系统中移除,因为如果被移除的话可能会导致数据丢失。
注意:当 pod 状态为 Pending
并且 pod 已经分配给节点或 pod 为 Running
状态时,PVC 处于活动状态
当启用 PVC 保护功能时,如果用户删除了一个 pod 正在使用的 PVC,则该 PVC 不会被立即删除。PVC 的删除将被推迟,直到 PVC 不再被任何 pod 使用
storageClass
一种动态的申请存储的机制
概念
StorageClass 是一种资源对象,用于定义持久卷(Persistent Volumes)的动态供给(Dynamic Provisioning)策略。StorageClass 允许管理员定义不同类型的存储,并指定如何动态创建持久卷以供应用程序使用。这使得 Kubernetes 集群中的存储管理更加灵活和自动化。
- 本文作者: 魏静崎
- 本文链接: https://slightwjq.github.io/2025/07/02/K8s学习-6 存储/
- 版权声明: 该文章来源及最终解释权归作者所有